{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分析用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 每个地区的用户，习惯风俗会有一定的差异，，分析一下地区"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts = df_user['location'].value_counts()\n",
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 平均每个地区，存在的用户个数\n",
    "location_value_counts.sum() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "### 由于，每个地区分的太细，所以分类太多，我们将地区以国家进行划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 集中在少部分地区\n",
    "plt.plot(\n",
    "    #索引\n",
    "    range(len(location_value_counts)),\n",
    "    # 存在用户地区\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 根据年龄进行划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用户年龄为空的数据\n",
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 取年龄不为空的数据\n",
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 根据年龄进行升序排列\n",
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制年龄分布曲线\n",
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 进行年龄划分\n",
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    # 年龄分类\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    # 标签\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 打分表分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "# 删除 nan\n",
    "\n",
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 用户活跃度\n",
    "\n",
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    # 用户索引\n",
    "    range(len(user_value_counts)),\n",
    "    # 打分系数\n",
    "    user_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "### 商品流行度分析\n",
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    # 商品id\n",
    "    range(len(item_value_counts)),\n",
    "    # 商品被打分次数\n",
    "    item_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "\n",
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据user_id进行表合并\n",
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[109814,\n",
       " 561359,\n",
       " 182843,\n",
       " 854047,\n",
       " 559003,\n",
       " 225863,\n",
       " 80014,\n",
       " 795081,\n",
       " 1124497,\n",
       " 696669,\n",
       " 714705,\n",
       " 108845,\n",
       " 334836,\n",
       " 283236,\n",
       " 707194,\n",
       " 700021,\n",
       " 514144,\n",
       " 343464,\n",
       " 3503,\n",
       " 914936,\n",
       " 183738,\n",
       " 791873,\n",
       " 146542,\n",
       " 13830,\n",
       " 661565,\n",
       " 940198,\n",
       " 213986,\n",
       " 92038,\n",
       " 194541,\n",
       " 298162,\n",
       " 264764,\n",
       " 44535,\n",
       " 611952,\n",
       " 903112,\n",
       " 1000180,\n",
       " 556419,\n",
       " 984178,\n",
       " 77056,\n",
       " 639835,\n",
       " 720292,\n",
       " 1094021,\n",
       " 1012843,\n",
       " 433822,\n",
       " 1105356,\n",
       " 661154,\n",
       " 26315,\n",
       " 835165,\n",
       " 1075319,\n",
       " 910974,\n",
       " 1129357,\n",
       " 1019502,\n",
       " 1091796,\n",
       " 879747,\n",
       " 785428,\n",
       " 1069686,\n",
       " 66776,\n",
       " 380559,\n",
       " 173245,\n",
       " 1021114,\n",
       " 549217,\n",
       " 356781,\n",
       " 702337,\n",
       " 706564,\n",
       " 820391,\n",
       " 153701,\n",
       " 957909,\n",
       " 812972,\n",
       " 704865,\n",
       " 34200,\n",
       " 396491,\n",
       " 184879,\n",
       " 762346,\n",
       " 26904,\n",
       " 738016,\n",
       " 480519,\n",
       " 850854,\n",
       " 1115679,\n",
       " 1050689,\n",
       " 125255,\n",
       " 603355,\n",
       " 1037627,\n",
       " 489419,\n",
       " 1141207,\n",
       " 1014626,\n",
       " 372432,\n",
       " 322461,\n",
       " 1124870,\n",
       " 932183,\n",
       " 793961,\n",
       " 967407,\n",
       " 92547,\n",
       " 21290,\n",
       " 282544,\n",
       " 957015,\n",
       " 405121,\n",
       " 44058,\n",
       " 537630,\n",
       " 738297,\n",
       " 570278,\n",
       " 910727,\n",
       " 881553,\n",
       " 745,\n",
       " 227794,\n",
       " 131300,\n",
       " 1070219,\n",
       " 744617,\n",
       " 186203,\n",
       " 173865,\n",
       " 908486,\n",
       " 17954,\n",
       " 1123656,\n",
       " 791588,\n",
       " 154107,\n",
       " 1146267,\n",
       " 847684,\n",
       " 61104,\n",
       " 676243,\n",
       " 550586,\n",
       " 990926,\n",
       " 69271,\n",
       " 702190,\n",
       " 868371,\n",
       " 730578,\n",
       " 49895,\n",
       " 343636,\n",
       " 878786,\n",
       " 134734,\n",
       " 301956,\n",
       " 780370,\n",
       " 492754,\n",
       " 164367,\n",
       " 119871,\n",
       " 1087784,\n",
       " 812035,\n",
       " 1127295,\n",
       " 642071,\n",
       " 306476,\n",
       " 610679,\n",
       " 816335,\n",
       " 772775,\n",
       " 265226,\n",
       " 1121809,\n",
       " 708259,\n",
       " 1084444,\n",
       " 250748,\n",
       " 349808,\n",
       " 810016,\n",
       " 906351,\n",
       " 130140,\n",
       " 285245,\n",
       " 953660,\n",
       " 43227,\n",
       " 733037,\n",
       " 943139,\n",
       " 946127,\n",
       " 637126,\n",
       " 899696,\n",
       " 59261,\n",
       " 332560,\n",
       " 1093855,\n",
       " 681273,\n",
       " 1083897,\n",
       " 1079444,\n",
       " 288088,\n",
       " 720520,\n",
       " 1048832,\n",
       " 219734,\n",
       " 1143907,\n",
       " 773850,\n",
       " 471658,\n",
       " 713201,\n",
       " 194735,\n",
       " 569903,\n",
       " 1061791,\n",
       " 510109,\n",
       " 426292,\n",
       " 675402,\n",
       " 554798,\n",
       " 835023,\n",
       " 90229,\n",
       " 1049723,\n",
       " 168530,\n",
       " 413337,\n",
       " 1059336,\n",
       " 418380,\n",
       " 35987,\n",
       " 407189,\n",
       " 562560,\n",
       " 484291,\n",
       " 178467,\n",
       " 664856,\n",
       " 175617,\n",
       " 715431,\n",
       " 1127600,\n",
       " 279901,\n",
       " 1120263,\n",
       " 284050,\n",
       " 1014935,\n",
       " 1032400,\n",
       " 835413,\n",
       " 59191,\n",
       " 538657,\n",
       " 1019467,\n",
       " 714125,\n",
       " 830080,\n",
       " 470076,\n",
       " 1051213,\n",
       " 264463,\n",
       " 12500,\n",
       " 1036988,\n",
       " 720150,\n",
       " 256515,\n",
       " 109964,\n",
       " 756328,\n",
       " 966286,\n",
       " 758835,\n",
       " 882401,\n",
       " 661665,\n",
       " 752186,\n",
       " 454231,\n",
       " 941719,\n",
       " 719392,\n",
       " 403639,\n",
       " 378905,\n",
       " 801897,\n",
       " 130950,\n",
       " 869746,\n",
       " 787134,\n",
       " 1049571,\n",
       " 556750,\n",
       " 366747,\n",
       " 789377,\n",
       " 772836,\n",
       " 145037,\n",
       " 620545,\n",
       " 256537,\n",
       " 556617,\n",
       " 1054510,\n",
       " 675773,\n",
       " 115157,\n",
       " 798144,\n",
       " 108221,\n",
       " 814571,\n",
       " 626029,\n",
       " 225372,\n",
       " 976325,\n",
       " 680935,\n",
       " 508920,\n",
       " 934119,\n",
       " 557662,\n",
       " 921114,\n",
       " 721532,\n",
       " 520960,\n",
       " 955223,\n",
       " 1050664,\n",
       " 576761,\n",
       " 707114,\n",
       " 102275,\n",
       " 382113,\n",
       " 258661,\n",
       " 41758,\n",
       " 897832,\n",
       " 1041148,\n",
       " 276592,\n",
       " 1001016,\n",
       " 1122197,\n",
       " 89674,\n",
       " 986307,\n",
       " 1136472,\n",
       " 296855,\n",
       " 683338,\n",
       " 775486,\n",
       " 463170,\n",
       " 67431,\n",
       " 971833,\n",
       " 1057208,\n",
       " 605469,\n",
       " 29229,\n",
       " 672395,\n",
       " 810551,\n",
       " 477263,\n",
       " 131356,\n",
       " 531338,\n",
       " 597882,\n",
       " 352364,\n",
       " 872534,\n",
       " 749995,\n",
       " 891240,\n",
       " 91029,\n",
       " 27200,\n",
       " 1041885,\n",
       " 345546,\n",
       " 415741,\n",
       " 97771,\n",
       " 565077,\n",
       " 1100527,\n",
       " 347977,\n",
       " 1114073,\n",
       " 406967,\n",
       " 634918,\n",
       " 1048237,\n",
       " 980191,\n",
       " 470048,\n",
       " 592334,\n",
       " 1106898,\n",
       " 193270,\n",
       " 216484,\n",
       " 928435,\n",
       " 1142866,\n",
       " 585733,\n",
       " 409571,\n",
       " 1092000,\n",
       " 142134,\n",
       " 822887,\n",
       " 852309,\n",
       " 940689,\n",
       " 232674,\n",
       " 126147,\n",
       " 907352,\n",
       " 914382,\n",
       " 1084838,\n",
       " 747563,\n",
       " 322642,\n",
       " 1034354,\n",
       " 282193,\n",
       " 407811,\n",
       " 443820,\n",
       " 506066,\n",
       " 78762,\n",
       " 512709,\n",
       " 436574,\n",
       " 154014,\n",
       " 846516,\n",
       " 54238,\n",
       " 22976,\n",
       " 864494,\n",
       " 675113,\n",
       " 1146990,\n",
       " 62809,\n",
       " 87748,\n",
       " 517014,\n",
       " 913653,\n",
       " 611074,\n",
       " 389919,\n",
       " 637921,\n",
       " 236389,\n",
       " 592546,\n",
       " 681184,\n",
       " 444619,\n",
       " 1081071,\n",
       " 54455,\n",
       " 758189,\n",
       " 320601,\n",
       " 977053,\n",
       " 471720,\n",
       " 868825,\n",
       " 465671,\n",
       " 1070707,\n",
       " 911428,\n",
       " 819301,\n",
       " 396273,\n",
       " 818071,\n",
       " 161624,\n",
       " 1042144,\n",
       " 89327,\n",
       " 601433,\n",
       " 291971,\n",
       " 997501,\n",
       " 224059,\n",
       " 264196,\n",
       " 255861,\n",
       " 964908,\n",
       " 740050,\n",
       " 36537,\n",
       " 933298,\n",
       " 1092348,\n",
       " 740307,\n",
       " 605566,\n",
       " 760831,\n",
       " 447476,\n",
       " 819118,\n",
       " 99059,\n",
       " 221725,\n",
       " 1066443,\n",
       " 198929,\n",
       " 681289,\n",
       " 173582,\n",
       " 431910,\n",
       " 805900,\n",
       " 377060,\n",
       " 878265,\n",
       " 264549,\n",
       " 996491,\n",
       " 294801,\n",
       " 11146,\n",
       " 340925,\n",
       " 180998,\n",
       " 694210,\n",
       " 67719,\n",
       " 205964,\n",
       " 307042,\n",
       " 459429,\n",
       " 959669,\n",
       " 902206,\n",
       " 421152,\n",
       " 848645,\n",
       " 125043,\n",
       " 118215,\n",
       " 318132,\n",
       " 239885,\n",
       " 967488,\n",
       " 189346,\n",
       " 281709,\n",
       " 86357,\n",
       " 752736,\n",
       " 921644,\n",
       " 432745,\n",
       " 501516,\n",
       " 493109,\n",
       " 904503,\n",
       " 716087,\n",
       " 299906,\n",
       " 187491,\n",
       " 20009,\n",
       " 611709,\n",
       " 686569,\n",
       " 840353,\n",
       " 724681,\n",
       " 480043,\n",
       " 127664,\n",
       " 121540,\n",
       " 135482,\n",
       " 231375,\n",
       " 523609,\n",
       " 604122,\n",
       " 491725,\n",
       " 262383,\n",
       " 1687,\n",
       " 1139035,\n",
       " 552101,\n",
       " 882632,\n",
       " 771216,\n",
       " 777227,\n",
       " 273156,\n",
       " 874231,\n",
       " 69671,\n",
       " 606766,\n",
       " 733699,\n",
       " 657401,\n",
       " 6892,\n",
       " 735140,\n",
       " 1061919,\n",
       " 6079,\n",
       " 616845,\n",
       " 167530,\n",
       " 793819,\n",
       " 385169,\n",
       " 682915,\n",
       " 932641,\n",
       " 219400,\n",
       " 1119979,\n",
       " 416757,\n",
       " 836914,\n",
       " 148076,\n",
       " 401981,\n",
       " 430634,\n",
       " 751340,\n",
       " 896262,\n",
       " 1008449,\n",
       " 594122,\n",
       " 1142270,\n",
       " 342581,\n",
       " 812204,\n",
       " 56025,\n",
       " 546023,\n",
       " 65258,\n",
       " 338387,\n",
       " 404069,\n",
       " 766551,\n",
       " 385881,\n",
       " 211420,\n",
       " 286015,\n",
       " 212640,\n",
       " 567175,\n",
       " 254291,\n",
       " 154333,\n",
       " 757303,\n",
       " 119078,\n",
       " 534461,\n",
       " 757390,\n",
       " 272820,\n",
       " 528632,\n",
       " 861400,\n",
       " 194544,\n",
       " 545223,\n",
       " 1089301,\n",
       " 250353,\n",
       " 1121839,\n",
       " 253657,\n",
       " 691618,\n",
       " 601670,\n",
       " 646787,\n",
       " 921714,\n",
       " 492782,\n",
       " 11221,\n",
       " 196228,\n",
       " 237492,\n",
       " 211657,\n",
       " 924725,\n",
       " 814234,\n",
       " 752392,\n",
       " 378105,\n",
       " 277462,\n",
       " 812471,\n",
       " 730,\n",
       " 871071,\n",
       " 439680,\n",
       " 503279,\n",
       " 8960,\n",
       " 874948,\n",
       " 271879,\n",
       " 175857,\n",
       " 366271,\n",
       " 1124340,\n",
       " 559272,\n",
       " 883535,\n",
       " 352631,\n",
       " 818167,\n",
       " 640838,\n",
       " 136144,\n",
       " 49969,\n",
       " 255885,\n",
       " 825624,\n",
       " 558081,\n",
       " 112323,\n",
       " 1140006,\n",
       " 394254,\n",
       " 650814,\n",
       " 653065,\n",
       " 1147987,\n",
       " 709294,\n",
       " 47523,\n",
       " 304645,\n",
       " 646161,\n",
       " 597447,\n",
       " 419355,\n",
       " 895433,\n",
       " 444527,\n",
       " 1043320,\n",
       " 94302,\n",
       " 886512,\n",
       " 137703,\n",
       " 322871,\n",
       " 356838,\n",
       " 99285,\n",
       " 466357,\n",
       " 131556,\n",
       " 941570,\n",
       " 398080,\n",
       " 840368,\n",
       " 910220,\n",
       " 1121554,\n",
       " 765728,\n",
       " 156459,\n",
       " 453377,\n",
       " 188095,\n",
       " 921317,\n",
       " 89614,\n",
       " 1121836,\n",
       " 653176,\n",
       " 65505,\n",
       " 436695,\n",
       " 74733,\n",
       " 327544,\n",
       " 1101688,\n",
       " 206803,\n",
       " 106452,\n",
       " 863570,\n",
       " 990900,\n",
       " 806012,\n",
       " 699942,\n",
       " 382605,\n",
       " 848726,\n",
       " 898912,\n",
       " 217962,\n",
       " 183103,\n",
       " 91237,\n",
       " 452969,\n",
       " 319263,\n",
       " 285083,\n",
       " 633261,\n",
       " 765021,\n",
       " 1069771,\n",
       " 882484,\n",
       " 551957,\n",
       " 594903,\n",
       " 861875,\n",
       " 385935,\n",
       " 1118852,\n",
       " 1109686,\n",
       " 192149,\n",
       " 4978,\n",
       " 302044,\n",
       " 1089983,\n",
       " 212087,\n",
       " 952204,\n",
       " 516509,\n",
       " 1005376,\n",
       " 61762,\n",
       " 779435,\n",
       " 621299,\n",
       " 976012,\n",
       " 783233,\n",
       " 596045,\n",
       " 1129327,\n",
       " 710147,\n",
       " 416666,\n",
       " 354801,\n",
       " 83209,\n",
       " 786209,\n",
       " 109864,\n",
       " 203064,\n",
       " 1029344,\n",
       " 781087,\n",
       " 883687,\n",
       " 371620,\n",
       " 219616,\n",
       " 152751,\n",
       " 485551,\n",
       " 804665,\n",
       " 284784,\n",
       " 1062166,\n",
       " 208527,\n",
       " 1023643,\n",
       " 1102436,\n",
       " 485971,\n",
       " 1101458,\n",
       " 1043396,\n",
       " 703065,\n",
       " 661239,\n",
       " 872957,\n",
       " 560817,\n",
       " 708507,\n",
       " 1008496,\n",
       " 370053,\n",
       " 493413,\n",
       " 214148,\n",
       " 110598,\n",
       " 1081654,\n",
       " 301385,\n",
       " 773880,\n",
       " 84976,\n",
       " 294237,\n",
       " 308638,\n",
       " 350728,\n",
       " 837626,\n",
       " 375029,\n",
       " 522242,\n",
       " 1066677,\n",
       " 383039,\n",
       " 1019013,\n",
       " 1048855,\n",
       " 10991,\n",
       " 986913,\n",
       " 326666,\n",
       " 580262,\n",
       " 734385,\n",
       " 1058912,\n",
       " 920159,\n",
       " 471446,\n",
       " 140275,\n",
       " 895225,\n",
       " 990655,\n",
       " 831120,\n",
       " 668110,\n",
       " 99155,\n",
       " 900474,\n",
       " 873334,\n",
       " 185073,\n",
       " 686426,\n",
       " 929899,\n",
       " 972748,\n",
       " 30341,\n",
       " 234151,\n",
       " 79704,\n",
       " 739630,\n",
       " 765748,\n",
       " 671750,\n",
       " 499782,\n",
       " 1149754,\n",
       " 998463,\n",
       " 715449,\n",
       " 489815,\n",
       " 68495,\n",
       " 387247,\n",
       " 265647,\n",
       " 941170,\n",
       " 424322,\n",
       " 983346,\n",
       " 898770,\n",
       " 29876,\n",
       " 730205,\n",
       " 262216,\n",
       " 564486,\n",
       " 747551,\n",
       " 1141674,\n",
       " 651711,\n",
       " 149932,\n",
       " 725600,\n",
       " 431650,\n",
       " 98373,\n",
       " 247675,\n",
       " 269563,\n",
       " 1084426,\n",
       " 21081,\n",
       " 1019358,\n",
       " 1080897,\n",
       " 881715,\n",
       " 838210,\n",
       " 1047647,\n",
       " 134457,\n",
       " 395178,\n",
       " 384724,\n",
       " 732095,\n",
       " 480006,\n",
       " 690151,\n",
       " 869687,\n",
       " 1024044,\n",
       " 245292,\n",
       " 830302,\n",
       " 153605,\n",
       " 753034,\n",
       " 1068851,\n",
       " 787618,\n",
       " 214983,\n",
       " 410952,\n",
       " 539302,\n",
       " 187985,\n",
       " 253860,\n",
       " 772147,\n",
       " 366816,\n",
       " 398503,\n",
       " 172810,\n",
       " 137151,\n",
       " 885524,\n",
       " 940566,\n",
       " 915974,\n",
       " 938218,\n",
       " 84673,\n",
       " 869504,\n",
       " 108104,\n",
       " 196960,\n",
       " 627310,\n",
       " 1064306,\n",
       " 823297,\n",
       " 789417,\n",
       " 696949,\n",
       " 771291,\n",
       " 732272,\n",
       " 132346,\n",
       " 698591,\n",
       " 388873,\n",
       " 253950,\n",
       " 56545,\n",
       " 931959,\n",
       " 821739,\n",
       " 1048758,\n",
       " 673920,\n",
       " 69142,\n",
       " 429117,\n",
       " 601889,\n",
       " 662863,\n",
       " 602012,\n",
       " 318152,\n",
       " 670651,\n",
       " 989202,\n",
       " 756439,\n",
       " 474776,\n",
       " 1120703,\n",
       " 72267,\n",
       " 987566,\n",
       " 326563,\n",
       " 436186,\n",
       " 692428,\n",
       " 504832,\n",
       " 997963,\n",
       " 464807,\n",
       " 654636,\n",
       " 341123,\n",
       " 412899,\n",
       " 972134,\n",
       " 1011474,\n",
       " 693777,\n",
       " 998308,\n",
       " 937273,\n",
       " 971488,\n",
       " 565547,\n",
       " 915108,\n",
       " 615375,\n",
       " 166356,\n",
       " 825550,\n",
       " 977247,\n",
       " 206661,\n",
       " 675497,\n",
       " 802724,\n",
       " 1112313,\n",
       " 271197,\n",
       " 488947,\n",
       " 120296,\n",
       " 337667,\n",
       " 872923,\n",
       " 1067939,\n",
       " 931441,\n",
       " 571915,\n",
       " 492963,\n",
       " 609368,\n",
       " 366935,\n",
       " 1091089,\n",
       " 497956,\n",
       " 875022,\n",
       " 173847,\n",
       " 808617,\n",
       " 1148637,\n",
       " 132492,\n",
       " 772276,\n",
       " 976831,\n",
       " 282847,\n",
       " 352816,\n",
       " 722030,\n",
       " 269181,\n",
       " 293044,\n",
       " 638183,\n",
       " 872316,\n",
       " 323973,\n",
       " 336192,\n",
       " 952491,\n",
       " 562512,\n",
       " 486553,\n",
       " 411430,\n",
       " 622232,\n",
       " 401121,\n",
       " 103150,\n",
       " 648223,\n",
       " 402254,\n",
       " 938155,\n",
       " 53999,\n",
       " 379389,\n",
       " 332318,\n",
       " 698432,\n",
       " 338213,\n",
       " 683223,\n",
       " 82865,\n",
       " 210899,\n",
       " 510396,\n",
       " 86585,\n",
       " 728612,\n",
       " 451989,\n",
       " 175258,\n",
       " 366484,\n",
       " 968530,\n",
       " 912529,\n",
       " 360797,\n",
       " 198188,\n",
       " 1099292,\n",
       " 106377,\n",
       " 497123,\n",
       " 213959,\n",
       " 869164,\n",
       " 326679,\n",
       " 498099,\n",
       " 643532,\n",
       " 358249,\n",
       " 944903,\n",
       " 268112,\n",
       " 773413,\n",
       " 838469,\n",
       " 47282,\n",
       " 1022339,\n",
       " 652032,\n",
       " 908495,\n",
       " 905702,\n",
       " 334966,\n",
       " 301381,\n",
       " 403577,\n",
       " 479885,\n",
       " 627810,\n",
       " 924923,\n",
       " 1060676,\n",
       " 306722,\n",
       " 413855,\n",
       " 333149,\n",
       " 1110303,\n",
       " 353721,\n",
       " 487363,\n",
       " 1045670,\n",
       " 248936,\n",
       " 198066,\n",
       " 634702,\n",
       " 371650,\n",
       " 34206,\n",
       " 1046159,\n",
       " 849686,\n",
       " 485076,\n",
       " 485994,\n",
       " 905554,\n",
       " 163568,\n",
       " 562565,\n",
       " 527432,\n",
       " 623014,\n",
       " 557870,\n",
       " 495074,\n",
       " 317657,\n",
       " 428469,\n",
       " 398744,\n",
       " 18562,\n",
       " 189848,\n",
       " 859949,\n",
       " 1075705,\n",
       " 634375,\n",
       " 1023988,\n",
       " 148905,\n",
       " 389049,\n",
       " 974997,\n",
       " 677793,\n",
       " 1058551,\n",
       " 151076,\n",
       " 914491,\n",
       " 1141980,\n",
       " 650380,\n",
       " 201003,\n",
       " 945582,\n",
       " 51170,\n",
       " 296587,\n",
       " 555883,\n",
       " 700745,\n",
       " 266862,\n",
       " 924954,\n",
       " 980983,\n",
       " 634185,\n",
       " 244015,\n",
       " 1038214,\n",
       " 1006276,\n",
       " 735650,\n",
       " 781706,\n",
       " 260931,\n",
       " 483990,\n",
       " 751646,\n",
       " 533716,\n",
       " 560773,\n",
       " 1105305,\n",
       " 193499,\n",
       " 217048,\n",
       " 19277,\n",
       " 727195,\n",
       " 784726,\n",
       " 944158,\n",
       " 938337,\n",
       " 812435,\n",
       " 315791,\n",
       " 374101,\n",
       " 503888,\n",
       " 376309,\n",
       " 696965,\n",
       " 434083,\n",
       " 950254,\n",
       " 301236,\n",
       " 511392,\n",
       " 898230,\n",
       " 779934,\n",
       " 791880,\n",
       " 337612,\n",
       " 541850,\n",
       " 768051,\n",
       " 829422,\n",
       " 1121091,\n",
       " 907689,\n",
       " 11869,\n",
       " 484354,\n",
       " 995680,\n",
       " 472817,\n",
       " 481443,\n",
       " 324567,\n",
       " 721185,\n",
       " 932828,\n",
       " 671763,\n",
       " 7845,\n",
       " 977803,\n",
       " 706265,\n",
       " 952390,\n",
       " 113574,\n",
       " 497935,\n",
       " 47926,\n",
       " 544254,\n",
       " 279500,\n",
       " 568045,\n",
       " 382396,\n",
       " 1030814,\n",
       " 382315,\n",
       " 333850,\n",
       " 507412,\n",
       " ...]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#设置随机种子，划分数据集\n",
    "random.seed(123)\n",
    "text_index_s = random.sample(\n",
    "    df_data.index.tolist(),\n",
    "    int(len(df_data) * 0.3)\n",
    ")\n",
    "text_index_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试集\n",
    "df_data_text = df_data.loc[\n",
    "    text_index_s\n",
    "]\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   344931 non-null  int64 \n",
      " 1   location  344931 non-null  object\n",
      " 2   age       344931 non-null  int64 \n",
      " 3   item_id   344931 non-null  object\n",
      " 4   rating    344931 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 11.8+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_text.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练集\n",
    "df_data_training = df_data[\n",
    "    ~df_data.index.isin(text_index_s)\n",
    "]\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data_text,open('./data/df_data_text.pkl','wb')\n",
    ")\n",
    "cPickle.dump(\n",
    "    df_data_training,open('./data/df_data_training.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = cPickle.load(open('./data/df_data_training.pkl','rb'))\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 804841 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   804841 non-null  int64 \n",
      " 1   location  804841 non-null  object\n",
      " 2   age       804841 non-null  int64 \n",
      " 3   item_id   804841 non-null  object\n",
      " 4   rating    804841 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 27.6+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['usa',\n",
       " 'canada',\n",
       " 'united kingdom',\n",
       " 'germany',\n",
       " '',\n",
       " 'australia',\n",
       " 'spain',\n",
       " 'france',\n",
       " 'n/a',\n",
       " 'italy',\n",
       " 'portugal']"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 地区排名\n",
    "df_data_training['location'].value_counts()[:11].index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "top10_location = ['usa',\n",
    " 'canada',\n",
    " 'united kingdom',\n",
    " 'germany',\n",
    " 'australia',\n",
    " 'spain',\n",
    " 'france',\n",
    " 'n/a',\n",
    " 'italy',\n",
    " 'portugal']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 、地区要么原样输出，否者输出other\n",
    "df_data_training['location'] = df_data_training['location'].apply(lambda location : location if location in top10_location else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               537641\n",
       "canada             72451\n",
       "other              60023\n",
       "united kingdom     35354\n",
       "germany            27687\n",
       "australia          18604\n",
       "spain              17949\n",
       "france              9735\n",
       "n/a                 9541\n",
       "italy               8482\n",
       "portugal            7374\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import defaultdict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如果有键，就是键，，要不就是字典\n",
    "feature_recommand = defaultdict(dict)\n",
    "feature_recommand_with_rating = defaultdict(dict)\n",
    "\n",
    "# 根据location进行分组\n",
    "for location,groupby_location in df_data_training.groupby('location'):\n",
    "    # 按照年龄\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        item_id_value_counts = groupby_location_age['item_id'].value_counts()\n",
    "        divide_boundary = max(np.percentile(item_id_value_counts,75),5) # 取75%的数字，没有取 5\n",
    "        groupby_location_age_top = groupby_location_age[\n",
    "            groupby_location_age['item_id'].isin(\n",
    "            item_id_value_counts[item_id_value_counts >= divide_boundary].index\n",
    "        )]\n",
    "        # 商品的平均值，进行排序\n",
    "        item_mean_rating = groupby_location_age_top.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20]\n",
    "        feature_recommand[location][age] = [\n",
    "            item_id\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        feature_recommand_with_rating[location][age] = [\n",
    "            {\"%s\" % item_id : round(item_mean_rating[item_id],2)}\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519', '1857022424'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318'],\n",
       "              4: ['0091867770'],\n",
       "              5: []},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350'],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628'],\n",
       "              2: [],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641'],\n",
       "              5: []},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553', '0552147680', '0552131067', '0552996181'],\n",
       "              5: []},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667', '0439064872', '059035342X'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743', '044022165X']}})"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: [{'0099771519': 7.0}, {'1857022424': 5.33}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0552998486': 8.8},\n",
       "               {'015602943X': 7.2},\n",
       "               {'0552140295': 6.8},\n",
       "               {'0440220602': 6.6},\n",
       "               {'0446532231': 6.2},\n",
       "               {'0007170866': 6.14},\n",
       "               {'1875989218': 6.09},\n",
       "               {'0099727412': 6.0},\n",
       "               {'0860074382': 5.91},\n",
       "               {'0140008535': 5.86},\n",
       "               {'0385335482': 5.71},\n",
       "               {'0553279556': 5.67},\n",
       "               {'1400034779': 5.4},\n",
       "               {'0743225082': 5.33},\n",
       "               {'0949206318': 5.17}],\n",
       "              4: [{'0091867770': 5.17}],\n",
       "              5: []},\n",
       "             'canada': {0: [{'0140505865': 9.4},\n",
       "               {'0140067477': 7.86},\n",
       "               {'076790592X': 7.4},\n",
       "               {'0553250426': 7.12},\n",
       "               {'0060392452': 7.0},\n",
       "               {'0676974791': 6.83},\n",
       "               {'080410526X': 6.8},\n",
       "               {'1552783081': 6.8},\n",
       "               {'0446350982': 6.8},\n",
       "               {'038079487X': 6.6},\n",
       "               {'0385505833': 6.4},\n",
       "               {'0676972152': 6.4},\n",
       "               {'0786867647': 6.4},\n",
       "               {'0060959037': 6.38},\n",
       "               {'0771099894': 6.25},\n",
       "               {'0812550706': 6.2},\n",
       "               {'0425122123': 6.2},\n",
       "               {'0446667900': 6.12},\n",
       "               {'0671011375': 6.0},\n",
       "               {'1550541129': 6.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0060915544': 8.43},\n",
       "               {'0140042393': 8.33},\n",
       "               {'0552137030': 8.29},\n",
       "               {'0836220889': 7.83},\n",
       "               {'0425105334': 7.8},\n",
       "               {'0836218256': 7.67},\n",
       "               {'0140277439': 7.6},\n",
       "               {'0345338588': 7.6},\n",
       "               {'1853260002': 7.5},\n",
       "               {'0060935464': 7.4},\n",
       "               {'0836218353': 7.2},\n",
       "               {'0671868691': 7.17},\n",
       "               {'0446532231': 7.15},\n",
       "               {'038542017X': 7.14},\n",
       "               {'0440224764': 7.0},\n",
       "               {'0770422578': 7.0},\n",
       "               {'0006485278': 7.0},\n",
       "               {'0451163524': 7.0},\n",
       "               {'0771060548': 6.89},\n",
       "               {'0553287893': 6.83}],\n",
       "              4: [{'0380718839': 8.4},\n",
       "               {'0316666343': 7.57},\n",
       "               {'0345370775': 7.0},\n",
       "               {'0684872153': 6.6},\n",
       "               {'0671758896': 6.2},\n",
       "               {'0676974805': 6.0},\n",
       "               {'0440213525': 5.57},\n",
       "               {'0515111279': 5.43},\n",
       "               {'034540288X': 5.29},\n",
       "               {'0676973094': 5.22},\n",
       "               {'0671027360': 5.2},\n",
       "               {'0684874350': 5.0}],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'2070370003': 9.0},\n",
       "               {'2070408507': 7.33},\n",
       "               {'2253140872': 7.14},\n",
       "               {'2266084372': 7.12},\n",
       "               {'2877302202': 6.8},\n",
       "               {'22530152730': 6.6},\n",
       "               {'2070744833': 6.57},\n",
       "               {'2253072079': 6.4},\n",
       "               {'2277260029': 6.4},\n",
       "               {'2290302155': 6.33},\n",
       "               {'2070363317': 6.2},\n",
       "               {'2253153265': 6.2},\n",
       "               {'2253144452': 6.17},\n",
       "               {'2264016124': 6.17},\n",
       "               {'2226135022': 6.12},\n",
       "               {'2020306492': 6.0},\n",
       "               {'2253154393': 6.0},\n",
       "               {'2290308285': 5.89},\n",
       "               {'2253150711': 5.71},\n",
       "               {'229030039X': 5.6}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: [{'3518366823': 6.8},\n",
       "               {'3423072571': 6.2},\n",
       "               {'3518368540': 6.0},\n",
       "               {'3423203668': 5.33},\n",
       "               {'3426029553': 5.25},\n",
       "               {'3453007867': 5.17},\n",
       "               {'3404148665': 5.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'3551551936': 9.6},\n",
       "               {'3551551693': 9.5},\n",
       "               {'3551551677': 9.5},\n",
       "               {'3423071516': 9.0},\n",
       "               {'3518372742': 8.0},\n",
       "               {'3257230478': 7.67},\n",
       "               {'3442727952': 7.43},\n",
       "               {'3442724686': 7.33},\n",
       "               {'3518100734': 7.33},\n",
       "               {'3596215226': 7.3},\n",
       "               {'3150000017': 7.14},\n",
       "               {'3426612704': 6.89},\n",
       "               {'3423205202': 6.88},\n",
       "               {'3499224615': 6.71},\n",
       "               {'3423202947': 6.7},\n",
       "               {'3442442354': 6.67},\n",
       "               {'3453071174': 6.6},\n",
       "               {'3551551685': 6.5},\n",
       "               {'3423204206': 6.44},\n",
       "               {'3518388762': 6.4}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: [{'8806142100': 6.33},\n",
       "               {'8826703132': 6.08},\n",
       "               {'884590184X': 6.0},\n",
       "               {'8817131628': 5.2}],\n",
       "              2: [],\n",
       "              3: [{'8845205118': 7.67},\n",
       "               {'8807813823': 7.2},\n",
       "               {'8845915700': 7.17},\n",
       "               {'8817106259': 6.29},\n",
       "               {'8807701510': 6.2},\n",
       "               {'8807816067': 6.18},\n",
       "               {'881786983X': 6.0},\n",
       "               {'0743222229': 5.86},\n",
       "               {'8807817039': 5.83},\n",
       "               {'8807814684': 5.5},\n",
       "               {'8806161741': 5.4},\n",
       "               {'884541096X': 5.4},\n",
       "               {'8845290077': 5.29},\n",
       "               {'8817106100': 5.25},\n",
       "               {'0451164075': 5.2},\n",
       "               {'8807816059': 5.1},\n",
       "               {'8804342838': 5.09},\n",
       "               {'9770390107900': 5.0}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: [{'8826703132': 9.0},\n",
       "               {'0060008024': 8.0},\n",
       "               {'0439064872': 7.38},\n",
       "               {'1558743669': 7.2},\n",
       "               {'0440211727': 7.0},\n",
       "               {'0330332775': 6.8},\n",
       "               {'0140298479': 6.67},\n",
       "               {'0380789019': 6.6},\n",
       "               {'034536676X': 6.5},\n",
       "               {'0446679593': 6.43},\n",
       "               {'0316693251': 6.4},\n",
       "               {'0316693006': 6.4},\n",
       "               {'1400034779': 6.23},\n",
       "               {'0345337662': 6.2},\n",
       "               {'0375706771': 6.2},\n",
       "               {'0385335881': 6.2},\n",
       "               {'0345339681': 6.17},\n",
       "               {'0553296981': 6.17},\n",
       "               {'044651652X': 6.12},\n",
       "               {'0062502182': 6.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0553296981': 9.38},\n",
       "               {'0441001971': 8.6},\n",
       "               {'0590353403': 8.5},\n",
       "               {'0671793489': 8.4},\n",
       "               {'0553213148': 7.6},\n",
       "               {'0515131229': 7.4},\n",
       "               {'0446310786': 7.3},\n",
       "               {'0439139597': 7.22},\n",
       "               {'0345378490': 7.2},\n",
       "               {'0747546290': 7.14},\n",
       "               {'0842329218': 7.14},\n",
       "               {'0312924585': 7.0},\n",
       "               {'3257228007': 6.86},\n",
       "               {'0786868716': 6.83},\n",
       "               {'051513628X': 6.8},\n",
       "               {'0151008116': 6.8},\n",
       "               {'0061092177': 6.8},\n",
       "               {'0375702709': 6.8},\n",
       "               {'0099800403': 6.5},\n",
       "               {'0439136350': 6.45}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'038082101X': 8.86},\n",
       "               {'0439139600': 7.33},\n",
       "               {'0380815923': 6.6},\n",
       "               {'006050918X': 6.4},\n",
       "               {'9505156944': 6.33},\n",
       "               {'0380977788': 5.86},\n",
       "               {'002542730X': 5.75},\n",
       "               {'0460877305': 5.71},\n",
       "               {'0385721234': 5.5},\n",
       "               {'0385413041': 5.4},\n",
       "               {'9726081378': 5.4},\n",
       "               {'0811214982': 5.3},\n",
       "               {'0330262130': 5.2},\n",
       "               {'0880381744': 5.2},\n",
       "               {'0552137030': 5.2},\n",
       "               {'9722113747': 5.17},\n",
       "               {'9580464162': 5.0},\n",
       "               {'9724614565': 5.0},\n",
       "               {'1401201385': 5.0}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'8445071416': 8.69},\n",
       "               {'8420616893': 8.62},\n",
       "               {'8420613487': 8.6},\n",
       "               {'950491036X': 8.43},\n",
       "               {'8478886508': 8.4},\n",
       "               {'8478886451': 8.4},\n",
       "               {'0156013924': 7.8},\n",
       "               {'8408039369': 7.8},\n",
       "               {'8420636282': 7.6},\n",
       "               {'8495501074': 7.43},\n",
       "               {'8420432113': 7.2},\n",
       "               {'8440627203': 7.17},\n",
       "               {'8445071408': 7.0},\n",
       "               {'0452282152': 7.0},\n",
       "               {'9681501225': 7.0},\n",
       "               {'8445071769': 6.8},\n",
       "               {'8420466034': 6.8},\n",
       "               {'8445071394': 6.8},\n",
       "               {'8423309223': 6.62},\n",
       "               {'8433914545': 6.62}],\n",
       "              4: [{'8408043641': 6}],\n",
       "              5: []},\n",
       "             'united kingdom': {0: [{'0590660543': 6.33},\n",
       "               {'000649840X': 6.17},\n",
       "               {'0330367358': 6.0},\n",
       "               {'0330376519': 6.0},\n",
       "               {'1857027051': 6.0},\n",
       "               {'0749395990': 5.67},\n",
       "               {'0552124753': 5.6},\n",
       "               {'0099771519': 5.33},\n",
       "               {'0749399902': 5.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'1844262553': 8.35},\n",
       "               {'0091891965': 8.2},\n",
       "               {'0140620117': 7.17},\n",
       "               {'0330258648': 7.0},\n",
       "               {'1860465811': 7.0},\n",
       "               {'1857231384': 7.0},\n",
       "               {'0552145424': 6.83},\n",
       "               {'0440206154': 6.67},\n",
       "               {'0552131059': 6.62},\n",
       "               {'0192833596': 6.6},\n",
       "               {'0440235596': 6.6},\n",
       "               {'0552142379': 6.5},\n",
       "               {'0330267388': 6.4},\n",
       "               {'0671024337': 6.4},\n",
       "               {'0380002930': 6.4},\n",
       "               {'0722532938': 6.38},\n",
       "               {'0552149519': 6.2},\n",
       "               {'0140287248': 6.17},\n",
       "               {'0380813815': 6.17},\n",
       "               {'0064407667': 6.12}],\n",
       "              4: [{'1844262553': 8.5},\n",
       "               {'0552147680': 6.6},\n",
       "               {'0552131067': 5.8},\n",
       "               {'0552996181': 5.0}],\n",
       "              5: []},\n",
       "             'usa': {0: [{'0156004801': 9.6},\n",
       "               {'0060256672': 9.33},\n",
       "               {'0971942315': 9.0},\n",
       "               {'1576738167': 9.0},\n",
       "               {'0553351397': 8.83},\n",
       "               {'0441002935': 8.6},\n",
       "               {'0615116426': 8.45},\n",
       "               {'0316735027': 8.33},\n",
       "               {'0140309578': 8.33},\n",
       "               {'0140185232': 8.2},\n",
       "               {'0553148001': 8.17},\n",
       "               {'0395977894': 8.1},\n",
       "               {'0743455967': 8.0},\n",
       "               {'0618002235': 8.0},\n",
       "               {'039480029X': 8.0},\n",
       "               {'0877738513': 8.0},\n",
       "               {'0060248025': 8.0},\n",
       "               {'0807083054': 7.89},\n",
       "               {'0553380958': 7.8},\n",
       "               {'0553213504': 7.8}],\n",
       "              1: [{'0064407667': 9.6},\n",
       "               {'0439064872': 8.0},\n",
       "               {'059035342X': 7.33}],\n",
       "              2: [{'0590353403': 9.44},\n",
       "               {'0440237688': 9.4},\n",
       "               {'0451191137': 8.8},\n",
       "               {'0439139597': 8.36},\n",
       "               {'0679886370': 8.17},\n",
       "               {'0140348107': 8.0},\n",
       "               {'0064472272': 7.71},\n",
       "               {'0439064864': 7.67},\n",
       "               {'0671027344': 7.64},\n",
       "               {'0446608955': 7.56},\n",
       "               {'0394820371': 7.43},\n",
       "               {'0385729332': 7.33},\n",
       "               {'0316666343': 7.29},\n",
       "               {'0385729340': 7.2},\n",
       "               {'0385730586': 7.0},\n",
       "               {'043935806X': 6.62},\n",
       "               {'0439136350': 6.6},\n",
       "               {'1576738159': 6.6},\n",
       "               {'0440439884': 6.4},\n",
       "               {'0345342968': 6.33}],\n",
       "              3: [{'0066238501': 9.88},\n",
       "               {'0517693119': 9.83},\n",
       "               {'0394800389': 9.83},\n",
       "               {'0920668364': 9.67},\n",
       "               {'0395177111': 9.5},\n",
       "               {'0890876789': 9.4},\n",
       "               {'0898159954': 9.4},\n",
       "               {'0316286850': 9.4},\n",
       "               {'0375503803': 9.2},\n",
       "               {'0316779059': 9.0},\n",
       "               {'156402976X': 9.0},\n",
       "               {'0553110845': 9.0},\n",
       "               {'0060256737': 8.83},\n",
       "               {'0060968966': 8.8},\n",
       "               {'0670451932': 8.8},\n",
       "               {'0805013407': 8.6},\n",
       "               {'0060961325': 8.6},\n",
       "               {'0140195831': 8.6},\n",
       "               {'0451525663': 8.6},\n",
       "               {'0451171926': 8.4}],\n",
       "              4: [{'0312303467': 9.4},\n",
       "               {'0060514957': 9.0},\n",
       "               {'0553377868': 8.86},\n",
       "               {'0688167888': 8.4},\n",
       "               {'0399151451': 8.0},\n",
       "               {'1579546463': 8.0},\n",
       "               {'0380977311': 7.86},\n",
       "               {'0553379615': 7.83},\n",
       "               {'0943233828': 7.8},\n",
       "               {'0446532452': 7.57},\n",
       "               {'0553565079': 7.4},\n",
       "               {'0066214769': 7.4},\n",
       "               {'0446322180': 7.29},\n",
       "               {'0439064864': 7.22},\n",
       "               {'0399151613': 7.2},\n",
       "               {'0449911519': 7.2},\n",
       "               {'0451169514': 7.17},\n",
       "               {'0553802461': 7.12},\n",
       "               {'0312983220': 7.0},\n",
       "               {'0312983301': 7.0}],\n",
       "              5: [{'0440234743': 7.6}, {'044022165X': 6.4}]}})"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand_with_rating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "pycharm": {
     "name": "#%% \n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['0971880107',\n",
       " '0316666343',\n",
       " '0385504209',\n",
       " '0312195516',\n",
       " '0060928336',\n",
       " '0679781587',\n",
       " '044023722X',\n",
       " '0142001740',\n",
       " '0316601950',\n",
       " '0671027360',\n",
       " '0446672211',\n",
       " '067976402X',\n",
       " '059035342X',\n",
       " '0375727345',\n",
       " '0440214041',\n",
       " '0452282152',\n",
       " '044021145X',\n",
       " '0440211727',\n",
       " '0345337662',\n",
       " '0804106304',\n",
       " '0440226430',\n",
       " '0156027321',\n",
       " '0060976845',\n",
       " '0060930535',\n",
       " '0440241073',\n",
       " '0345370775',\n",
       " '0671003755',\n",
       " '0743418174',\n",
       " '0671021001',\n",
       " '0312278586',\n",
       " '0446605239',\n",
       " '0786868716',\n",
       " '1400034779',\n",
       " '0440222656',\n",
       " '0440234743',\n",
       " '0345361792',\n",
       " '0440221471',\n",
       " '0440236673',\n",
       " '0316769487',\n",
       " '0385484518',\n",
       " '044022165X',\n",
       " '0345353145',\n",
       " '0345417623',\n",
       " '0440206154',\n",
       " '0446310786',\n",
       " '0375706771',\n",
       " '0060502258',\n",
       " '0446606812',\n",
       " '044651652X',\n",
       " '0446610038',\n",
       " '0440220602',\n",
       " '0440225701',\n",
       " '0439064872',\n",
       " '0440213525',\n",
       " '0345443284',\n",
       " '0671510053',\n",
       " '0140293248',\n",
       " '0060934417',\n",
       " '0385335482',\n",
       " '0452282829',\n",
       " '006101351X',\n",
       " '0375707972',\n",
       " '0375726403',\n",
       " '0440224764',\n",
       " '0316284955',\n",
       " '0316776963',\n",
       " '043935806X',\n",
       " '0312291639',\n",
       " '0385492081',\n",
       " '0385720106',\n",
       " '0345342968',\n",
       " '0684872153',\n",
       " '0385265700',\n",
       " '0375700757',\n",
       " '0380789035',\n",
       " '0375725784',\n",
       " '0060938455',\n",
       " '0553572997',\n",
       " '068484477X',\n",
       " '0842329129',\n",
       " '0316096199',\n",
       " '0385722206',\n",
       " '0061009059',\n",
       " '0312305060',\n",
       " '0060987103',\n",
       " '0440224675',\n",
       " '0553279912',\n",
       " '0345378490',\n",
       " '0671001795',\n",
       " '0142000205',\n",
       " '0684874350',\n",
       " '0446364193',\n",
       " '0345351525',\n",
       " '0060392452',\n",
       " '0345339681',\n",
       " '0446608955',\n",
       " '0743237188',\n",
       " '0316569321',\n",
       " '0446611867',\n",
       " '0446612545',\n",
       " '0345313860',\n",
       " '0515131229',\n",
       " '0440235596',\n",
       " '014028009X',\n",
       " '0805063897',\n",
       " '0449212602',\n",
       " '0380731851',\n",
       " '0345339703',\n",
       " '0553268880',\n",
       " '0345391055',\n",
       " '1558743669',\n",
       " '0671027387',\n",
       " '0440226104',\n",
       " '0679746048',\n",
       " '080410753X',\n",
       " '051513287X',\n",
       " '0345387651',\n",
       " '0380730138',\n",
       " '0446611212',\n",
       " '0679429220',\n",
       " '0804114986',\n",
       " '0345380371',\n",
       " '0385486804',\n",
       " '0380002930',\n",
       " '0060959037',\n",
       " '0060915544',\n",
       " '0425175405',\n",
       " '0399501487',\n",
       " '0064407667',\n",
       " '0786881852',\n",
       " '0312983271',\n",
       " '0446605484',\n",
       " '0440241537',\n",
       " '0446607657',\n",
       " '0345384466',\n",
       " '0553582755',\n",
       " '080410526X',\n",
       " '0312924585',\n",
       " '034540288X',\n",
       " '0553280341',\n",
       " '0060987529',\n",
       " '0451166892',\n",
       " '0380789019',\n",
       " '0425167313',\n",
       " '0312966091',\n",
       " '014025448X',\n",
       " '0439136369',\n",
       " '0140244824',\n",
       " '0449005615',\n",
       " '0062502182',\n",
       " '0140298479',\n",
       " '0679745203',\n",
       " '0425152251',\n",
       " '074343627X',\n",
       " '0425180638',\n",
       " '0060987561',\n",
       " '080411109X',\n",
       " '0425147622',\n",
       " '0380018179',\n",
       " '0440211263',\n",
       " '0425154092',\n",
       " '0446601241',\n",
       " '0070212570',\n",
       " '068484267X',\n",
       " '0446612790',\n",
       " '0060977493',\n",
       " '0449003795',\n",
       " '0671041789',\n",
       " '0515132020',\n",
       " '080411868X',\n",
       " '0061097101',\n",
       " '038079487X',\n",
       " '0743225406',\n",
       " '1573229326',\n",
       " '0312966970',\n",
       " '0385508042',\n",
       " '0871136791',\n",
       " '0385505833',\n",
       " '0671038184',\n",
       " '0425158616',\n",
       " '0345402871',\n",
       " '0312971346',\n",
       " '0609804138',\n",
       " '0312995423',\n",
       " '0767902521',\n",
       " '0451524934',\n",
       " '155874262X',\n",
       " '0425162443',\n",
       " '0812550706',\n",
       " '0345439104',\n",
       " '0553250426',\n",
       " '0385479565',\n",
       " '067102423X',\n",
       " '0385335881',\n",
       " '0141000198',\n",
       " '1400031354',\n",
       " '0440236703',\n",
       " '0446359866',\n",
       " '0449907481',\n",
       " '0312980140',\n",
       " '0425182908',\n",
       " '0380718340',\n",
       " '0671042858',\n",
       " '0440212561',\n",
       " '0767905180',\n",
       " '0375703055',\n",
       " '0425169863',\n",
       " '038550120X',\n",
       " '0316781266',\n",
       " '0553580221',\n",
       " '0385503822',\n",
       " '1559029838',\n",
       " '0380718332',\n",
       " '0553260111',\n",
       " '014023313X',\n",
       " '0312282990',\n",
       " '014029628X',\n",
       " '0671024248',\n",
       " '0451183665',\n",
       " '0066214122',\n",
       " '0316899984',\n",
       " '0743436210',\n",
       " '0553579606',\n",
       " '0439139600',\n",
       " '0451184963',\n",
       " '0439139597',\n",
       " '0375702709',\n",
       " '1573225789',\n",
       " '034538475X',\n",
       " '0671004530',\n",
       " '0345438329',\n",
       " '0441569595',\n",
       " '0671014196',\n",
       " '0446670251',\n",
       " '0553279378',\n",
       " '0446532231',\n",
       " '042511774X',\n",
       " '0515132187',\n",
       " '0439136350',\n",
       " '0553277472',\n",
       " '0446610399',\n",
       " '0140067477',\n",
       " '0590353403',\n",
       " '044651862X',\n",
       " '038572179X',\n",
       " '042516098X',\n",
       " '0451203771',\n",
       " '0316780375',\n",
       " '0671867156',\n",
       " '0375703861',\n",
       " '0399144463',\n",
       " '0425163407',\n",
       " '0312976275',\n",
       " '0142001430',\n",
       " '0446604801',\n",
       " '0452264464',\n",
       " '034541389X',\n",
       " '0515126772',\n",
       " '0440180295',\n",
       " '0553280368',\n",
       " '0345339738',\n",
       " '0060175400',\n",
       " '0345465083',\n",
       " '0671758896',\n",
       " '0553275976',\n",
       " '0140119906',\n",
       " '0440224624',\n",
       " '0446606189',\n",
       " '0449003787',\n",
       " '0316969443',\n",
       " '0449221504',\n",
       " '0345350499',\n",
       " '0515128554',\n",
       " '0345413903',\n",
       " '0345348036',\n",
       " '0553272535',\n",
       " '0767900383',\n",
       " '0385498802',\n",
       " '055356451X',\n",
       " '0842329218',\n",
       " '0446607711',\n",
       " '0671004573',\n",
       " '0142001805',\n",
       " '0515130389',\n",
       " '0446516538',\n",
       " '0425147584',\n",
       " '0441003257',\n",
       " '0061015725',\n",
       " '002542730X',\n",
       " '0385336179',\n",
       " '0345339711',\n",
       " '0099771519',\n",
       " '0425116840',\n",
       " '0451156609',\n",
       " '0060391626',\n",
       " '0684801523',\n",
       " '0440235162',\n",
       " '140003065X',\n",
       " '0446608815',\n",
       " '0553375407',\n",
       " '0684848783',\n",
       " '0060921145',\n",
       " '0553279556',\n",
       " '0439064864',\n",
       " '0743227441',\n",
       " '0312421273',\n",
       " '0804111359',\n",
       " '031298328X',\n",
       " '0451167317',\n",
       " '0446394521',\n",
       " '0385721420',\n",
       " '0553579754',\n",
       " '042510107X',\n",
       " '0553271636',\n",
       " '0425083837',\n",
       " '0440219078',\n",
       " '0449221512',\n",
       " '0345413350',\n",
       " '0451526341',\n",
       " '0425143325',\n",
       " '067088300X',\n",
       " '0553582747',\n",
       " '0312980159',\n",
       " '0385474016',\n",
       " '0553284789',\n",
       " '0425133540',\n",
       " '0449219364',\n",
       " '0553574574',\n",
       " '0749397543',\n",
       " '0451203895',\n",
       " '0525947647',\n",
       " '0553582526',\n",
       " '0441172717',\n",
       " '0440498058',\n",
       " '0446610100',\n",
       " '0380813815',\n",
       " '0312983867',\n",
       " '0151008116',\n",
       " '0312243022',\n",
       " '006016848X',\n",
       " '0375703063',\n",
       " '044022103X',\n",
       " '0671617028',\n",
       " '0451172817',\n",
       " '0553578693',\n",
       " '0440414806',\n",
       " '0671727796',\n",
       " '0553582135',\n",
       " '0385720955',\n",
       " '014100018X',\n",
       " '0375705856',\n",
       " '0671004107',\n",
       " '0449223612',\n",
       " '0449221482',\n",
       " '0786817070',\n",
       " '0385497466',\n",
       " '0316969680',\n",
       " '0446606324',\n",
       " '1558745157',\n",
       " '037570504X',\n",
       " '0446679593',\n",
       " '0671011367',\n",
       " '0375502238',\n",
       " '0446604666',\n",
       " '0449223604',\n",
       " '0425115801',\n",
       " '0440998050',\n",
       " '0440223202',\n",
       " '031242227X',\n",
       " '0345378482',\n",
       " '0743412028',\n",
       " '0812511816',\n",
       " '0425109720',\n",
       " '0449221490',\n",
       " '0446360589',\n",
       " '0515128546',\n",
       " '0449219461',\n",
       " '038550926X',\n",
       " '0553296981',\n",
       " '0451177096',\n",
       " '0671028375',\n",
       " '0440221595',\n",
       " '0425182878',\n",
       " '0671888587',\n",
       " '0425144429',\n",
       " '0060958022',\n",
       " '0671793489',\n",
       " '0553571885',\n",
       " '0446611808',\n",
       " '042513525X',\n",
       " '0316089699',\n",
       " '0425172546',\n",
       " '0553289411',\n",
       " '0553273914',\n",
       " '0670865796',\n",
       " '0061097314',\n",
       " '051513628X',\n",
       " '0385511612',\n",
       " '0345368754',\n",
       " '0425147363',\n",
       " '038082101X',\n",
       " '0679744398',\n",
       " '0553250531',\n",
       " '0446531332',\n",
       " '0440224594',\n",
       " '0767905385',\n",
       " '0345427637',\n",
       " '0345447840',\n",
       " '0553292722',\n",
       " '0679751521',\n",
       " '0671004565',\n",
       " '0451202341',\n",
       " '0345391802',\n",
       " '038549081X',\n",
       " '089480829X',\n",
       " '0312990456',\n",
       " '1558744150',\n",
       " '0399150897',\n",
       " '0671042262',\n",
       " '0446603589',\n",
       " '0373218397',\n",
       " '0440213290',\n",
       " '0671004549',\n",
       " '0679731148',\n",
       " '0671894455',\n",
       " '0380710218',\n",
       " '0345370805',\n",
       " '0786885688',\n",
       " '0312422156',\n",
       " '0679735909',\n",
       " '0446611085',\n",
       " '0312265867',\n",
       " '0452283205',\n",
       " '0156628708',\n",
       " '0446609404',\n",
       " '0446364800',\n",
       " '0452260116',\n",
       " '0743411250',\n",
       " '055321313X',\n",
       " '0425122123',\n",
       " '0671867113',\n",
       " '0345384369',\n",
       " '0743206045',\n",
       " '0671673688',\n",
       " '0743418204',\n",
       " '0375506039',\n",
       " '0440202043',\n",
       " '0451160525',\n",
       " '0670892963',\n",
       " '0515121843',\n",
       " '0553582127',\n",
       " '0671708635',\n",
       " '0312983824',\n",
       " '0425180964',\n",
       " '0743460529',\n",
       " '0452269571',\n",
       " '0553564528',\n",
       " '0385420161',\n",
       " '0375727132',\n",
       " '0345435168',\n",
       " '0671867172',\n",
       " '0802130208',\n",
       " '0842342702',\n",
       " '0446603716',\n",
       " '0316789089',\n",
       " '0786867647',\n",
       " '0670894184',\n",
       " '0670880728',\n",
       " '0441790348',\n",
       " '039592720X',\n",
       " '0345446860',\n",
       " '1878424319',\n",
       " '0373218192',\n",
       " '0553573136',\n",
       " '0671568175',\n",
       " '0743224574',\n",
       " '0553561618',\n",
       " '0345369947',\n",
       " '0399147195',\n",
       " '0553569910',\n",
       " '0515135062',\n",
       " '0330332775',\n",
       " '0451186362',\n",
       " '0385730586',\n",
       " '0060173289',\n",
       " '0374129983',\n",
       " '0425124347',\n",
       " '051512608X',\n",
       " '0425170349',\n",
       " '1558744630',\n",
       " '0452284449',\n",
       " '038533334X',\n",
       " '0446611778',\n",
       " '0385424728',\n",
       " '0743467523',\n",
       " '055356160X',\n",
       " '0345424719',\n",
       " '0553581554',\n",
       " '0385502532',\n",
       " '0375760911',\n",
       " '0671042572',\n",
       " '0440215625',\n",
       " '0345386108',\n",
       " '0452280621',\n",
       " '0446608890',\n",
       " '0425107469',\n",
       " '0552124753',\n",
       " '0515127833',\n",
       " '0743211383',\n",
       " '0679444815',\n",
       " '0451176464',\n",
       " '0380730847',\n",
       " '0064407675',\n",
       " '0449227421',\n",
       " '0394820371',\n",
       " '0451181379',\n",
       " '0060929871',\n",
       " '0449006522',\n",
       " '0373218036',\n",
       " '0140177396',\n",
       " '0743437640',\n",
       " '0451169530',\n",
       " '0446520802',\n",
       " '0380012863',\n",
       " '0842329242',\n",
       " '0679772677',\n",
       " '0064472272',\n",
       " '0316781010',\n",
       " '0060922532',\n",
       " '0802139256',\n",
       " '0553582143',\n",
       " '0515136530',\n",
       " '0375412824',\n",
       " '0316666009',\n",
       " '0316788228',\n",
       " '0060199652',\n",
       " '0743211375',\n",
       " '0425178765',\n",
       " '038529929X',\n",
       " '0385472951',\n",
       " '0385490992',\n",
       " '0380717018',\n",
       " '0345384350',\n",
       " '0316693006',\n",
       " '0553580191',\n",
       " '1400031362',\n",
       " '0345413881',\n",
       " '0446675059',\n",
       " '0553578022',\n",
       " '0064400557',\n",
       " '006019491X',\n",
       " '038542471X',\n",
       " '0515122734',\n",
       " '0440218535',\n",
       " '0312265859',\n",
       " '0446610542',\n",
       " '0446613266',\n",
       " '0515133973',\n",
       " '0345413873',\n",
       " '0451204530',\n",
       " '0446607193',\n",
       " '0316782505',\n",
       " '0553569155',\n",
       " '0425158632',\n",
       " '0684865742',\n",
       " '0679446486',\n",
       " '0399149325',\n",
       " '0425184226',\n",
       " '0345436911',\n",
       " '0671867091',\n",
       " '042513699X',\n",
       " '0679734775',\n",
       " '0380977788',\n",
       " '0316693235',\n",
       " '0385510438',\n",
       " '0451207521',\n",
       " '0316693200',\n",
       " '0452282195',\n",
       " '0316602906',\n",
       " '0671693816',\n",
       " '0385493800',\n",
       " '0399146431',\n",
       " '0060096195',\n",
       " '0743457358',\n",
       " '0316777730',\n",
       " '0140254544',\n",
       " '0425155404',\n",
       " '0399149155',\n",
       " '0451205421',\n",
       " '0515133302',\n",
       " '0316168688',\n",
       " '0440122090',\n",
       " '0345444884',\n",
       " '0804115761',\n",
       " '0446609323',\n",
       " '0553282476',\n",
       " '0316781142',\n",
       " '0515136379',\n",
       " '0743203631',\n",
       " '0425153975',\n",
       " '1592400876',\n",
       " '0425132951',\n",
       " '0399145087',\n",
       " '038542017X',\n",
       " '0451163966',\n",
       " '0449134482',\n",
       " '0688177751',\n",
       " '034536676X',\n",
       " '034538184X',\n",
       " '0767915054',\n",
       " '0373484224',\n",
       " '0553560247',\n",
       " '0142004235',\n",
       " '0552998486',\n",
       " '080213825X',\n",
       " '0451206525',\n",
       " '0553274295',\n",
       " '1573225517',\n",
       " '0671880314',\n",
       " '0446519138',\n",
       " '0684867621',\n",
       " '0091867770',\n",
       " '0312144075',\n",
       " '034539657X',\n",
       " '0375706410',\n",
       " '0553213148',\n",
       " '0399146253',\n",
       " '0060932759',\n",
       " '0446365505',\n",
       " '0671683993',\n",
       " '034543479X',\n",
       " '0380820293',\n",
       " '0446605409',\n",
       " '0316182540',\n",
       " '0375500510',\n",
       " '1573229571',\n",
       " '0316777722',\n",
       " '0312971125',\n",
       " '0425192733',\n",
       " '006099486X',\n",
       " '0425174271',\n",
       " '0345422317',\n",
       " '0451169522',\n",
       " '0553572326',\n",
       " '0345354613',\n",
       " '0373825013',\n",
       " '0060008032',\n",
       " '0553576801',\n",
       " '080411935X',\n",
       " '0609610597',\n",
       " '0451153553',\n",
       " '0451208765',\n",
       " '0345404114',\n",
       " '0425136981',\n",
       " '0425092917',\n",
       " '0671727583',\n",
       " '0425177173',\n",
       " '042518630X',\n",
       " '0330375253',\n",
       " '0515130966',\n",
       " '0679442790',\n",
       " '0515124214',\n",
       " '0385512104',\n",
       " '067101420X',\n",
       " '0804105820',\n",
       " '0671027662',\n",
       " '0451180232',\n",
       " '0446606383',\n",
       " '0312306326',\n",
       " '0380727501',\n",
       " '0140179836',\n",
       " '0060916508',\n",
       " '0385335830',\n",
       " '1576737330',\n",
       " '0374199698',\n",
       " '0061020710',\n",
       " '1551668998',\n",
       " '0156006529',\n",
       " '0684833395',\n",
       " '067976397X',\n",
       " '0425192725',\n",
       " '051511992X',\n",
       " '0553569058',\n",
       " '0553580930',\n",
       " '0553265741',\n",
       " '0345348109',\n",
       " '1573227331',\n",
       " '0060512822',\n",
       " '0842329250',\n",
       " '0440200989',\n",
       " '0449912558',\n",
       " '0446603929',\n",
       " '0316602051',\n",
       " '0440241162',\n",
       " '0451170385',\n",
       " '0451197747',\n",
       " '0446602620',\n",
       " '0373218400',\n",
       " '0446525502',\n",
       " '0345445848',\n",
       " '0446667900',\n",
       " '0553274503',\n",
       " '0553571818',\n",
       " '0679735771',\n",
       " '0345441036',\n",
       " '0425151867',\n",
       " '0671027581',\n",
       " '0446363251',\n",
       " '0743437802',\n",
       " '051512317X',\n",
       " '0312982518',\n",
       " '0425185710',\n",
       " '0385424736',\n",
       " '0553583441',\n",
       " '0688177859',\n",
       " '1400031346',\n",
       " '0894805770',\n",
       " '0373484003',\n",
       " '0425147517',\n",
       " '0446670111',\n",
       " '0671011375',\n",
       " '0446530522',\n",
       " '042517736X',\n",
       " '0449910237',\n",
       " '0743206029',\n",
       " '0385475721',\n",
       " '0452268060',\n",
       " '0553280414',\n",
       " '0451188454',\n",
       " '0887307876',\n",
       " '0312244266',\n",
       " '043936213X',\n",
       " '076790592X',\n",
       " '0515120618',\n",
       " '0345314255',\n",
       " '0312274920',\n",
       " '0451188462',\n",
       " '044661064X',\n",
       " '0380817691',\n",
       " '080411918X',\n",
       " '0425178102',\n",
       " '0385503954',\n",
       " '0345422384',\n",
       " '0451191145',\n",
       " '0804108749',\n",
       " '0345397819',\n",
       " '0425150143',\n",
       " '0446525537',\n",
       " '0316678104',\n",
       " '0345416260',\n",
       " '0671741195',\n",
       " '034538430X',\n",
       " '0425178579',\n",
       " '0345366239',\n",
       " '0345413865',\n",
       " '0380814021',\n",
       " '0786866586',\n",
       " '0671027344',\n",
       " '0671014919',\n",
       " '0425119653',\n",
       " '0440217490',\n",
       " '0743235150',\n",
       " '0140042598',\n",
       " '0425166619',\n",
       " '0671537458',\n",
       " '0380710722',\n",
       " '081297106X',\n",
       " '0425142485',\n",
       " '0345413369',\n",
       " '1558745718',\n",
       " '0449203794',\n",
       " '0345354621',\n",
       " '0451209907',\n",
       " '0425145638',\n",
       " '0786889020',\n",
       " '0375504397',\n",
       " '0743439740',\n",
       " '0425121631',\n",
       " '0446604844',\n",
       " '0425189864',\n",
       " '0446350982',\n",
       " '0671525743',\n",
       " '0451169514',\n",
       " '0452281903',\n",
       " '0515135739',\n",
       " '0385508417',\n",
       " '0316693251',\n",
       " '0385720920',\n",
       " '1400032717',\n",
       " '0425161242',\n",
       " '0671038443',\n",
       " '0374100128',\n",
       " '0312966806',\n",
       " '0312924801',\n",
       " '067169507X',\n",
       " '0553295977',\n",
       " '0375412530',\n",
       " '0425140032',\n",
       " '0060926317',\n",
       " '0684862719',\n",
       " '0425130711',\n",
       " '0446605581',\n",
       " '055357230X',\n",
       " '0140092323',\n",
       " '0446365386',\n",
       " '0312986343',\n",
       " '0679731725',\n",
       " '0375413634',\n",
       " '0679723161',\n",
       " '0425172996',\n",
       " '0671701231',\n",
       " '0316693286',\n",
       " '0440225825',\n",
       " '0671026011',\n",
       " '0316603287',\n",
       " '042510687X',\n",
       " '0525946829',\n",
       " '0099387913',\n",
       " '0451186923',\n",
       " '0425167720',\n",
       " '0440217563',\n",
       " '0440940001',\n",
       " '0446604232',\n",
       " '0671743058',\n",
       " '0449911519',\n",
       " '0312263120',\n",
       " '0743418131',\n",
       " '1573229725',\n",
       " '0312978383',\n",
       " '0670030643',\n",
       " '0553258001',\n",
       " '0553584510',\n",
       " '0446527785',\n",
       " '0425157539',\n",
       " '0553263226',\n",
       " '0425179613',\n",
       " '0385503857',\n",
       " '0671028367',\n",
       " '044661193X',\n",
       " '0451142934',\n",
       " '0312983298',\n",
       " '0805059555',\n",
       " '015100692X',\n",
       " '0446604275',\n",
       " '0553582763',\n",
       " '0671886665',\n",
       " '0345404769',\n",
       " '0312974256',\n",
       " '0446356832',\n",
       " '006092988X',\n",
       " '034540761X',\n",
       " '0446523569',\n",
       " '1558531025',\n",
       " '0451166582',\n",
       " '0425181103',\n",
       " '0425189031',\n",
       " '0345392825',\n",
       " '0312952716',\n",
       " '0156028778',\n",
       " '0553572210',\n",
       " '0446608262',\n",
       " '000649840X',\n",
       " '042518286X',\n",
       " '1565122968',\n",
       " '0373243286',\n",
       " '0060740450',\n",
       " '0312201656',\n",
       " '0553582658',\n",
       " '0679457526',\n",
       " '0767916069',\n",
       " '067697175X',\n",
       " '0671670689',\n",
       " '0679439382',\n",
       " '0373484232',\n",
       " '0425179885',\n",
       " '0679720200',\n",
       " '0425151875',\n",
       " '0440204194',\n",
       " '0028604199',\n",
       " '0671024094',\n",
       " '0805019375',\n",
       " '0425121259',\n",
       " '0515087122',\n",
       " '0671250671',\n",
       " '0373244487',\n",
       " '0670894605',\n",
       " '0553210092',\n",
       " '0553212583',\n",
       " '0440236738',\n",
       " '0812570944',\n",
       " '0553583468',\n",
       " '0345386132',\n",
       " '0689817851',\n",
       " '0671034022',\n",
       " '0440201926',\n",
       " '0440211891',\n",
       " '0553213172',\n",
       " '0451163524',\n",
       " '067100042X',\n",
       " '0446673544',\n",
       " '0345384377',\n",
       " '0451151259',\n",
       " '0553578316',\n",
       " '0375705198',\n",
       " '0440221315',\n",
       " '0767905202',\n",
       " '0553211404',\n",
       " '0743469801',\n",
       " '0060964049',\n",
       " '0345447867',\n",
       " '0440236053',\n",
       " '0553278029',\n",
       " '0671023616',\n",
       " '0156007479',\n",
       " '0441005489',\n",
       " '0553573403',\n",
       " '006109921X',\n",
       " '0743417682',\n",
       " '0812543262',\n",
       " '0425118703',\n",
       " '0316693324',\n",
       " '0064471047',\n",
       " '0440224705',\n",
       " '0553586122',\n",
       " '0375703764',\n",
       " '0061098795',\n",
       " '0385509456',\n",
       " '0316690619',\n",
       " '0786862564',\n",
       " '0671028383',\n",
       " '0345452569',\n",
       " '0446607207',\n",
       " '0446353205',\n",
       " '0553208845',\n",
       " '0425152898',\n",
       " '0805062971',\n",
       " '0385494246',\n",
       " '0380703882',\n",
       " '0425162788',\n",
       " '0590660543',\n",
       " '0671776134',\n",
       " '0060930187',\n",
       " '0385490445',\n",
       " '0330262130',\n",
       " '0345389964',\n",
       " '0786890436',\n",
       " '0451191013',\n",
       " '0373484429',\n",
       " '0345441133',\n",
       " '0671729411',\n",
       " '0671741187',\n",
       " '0061000175',\n",
       " '0684857820',\n",
       " '0451203593',\n",
       " '0515118656',\n",
       " '055356773X',\n",
       " '0373484410',\n",
       " '0060188731',\n",
       " '0679742298',\n",
       " '0385314698',\n",
       " '0380600129',\n",
       " '0552137030',\n",
       " '0440207622',\n",
       " '8873122933',\n",
       " '0451190491',\n",
       " '0425169693',\n",
       " '0375414053',\n",
       " '0373483694',\n",
       " '0553579983',\n",
       " '0679419462',\n",
       " '155166674X',\n",
       " '1857022424',\n",
       " '0446530077',\n",
       " '0446611476',\n",
       " '0446527165',\n",
       " '0553578308',\n",
       " '0440176484',\n",
       " '0425161722',\n",
       " '0142002267',\n",
       " '0399143947',\n",
       " '0385315236',\n",
       " '0385482388',\n",
       " '0446604402',\n",
       " '0345396936',\n",
       " '044900371X',\n",
       " '0312979096',\n",
       " '0061000043',\n",
       " '0553562614',\n",
       " '0446602612',\n",
       " '0439404371',\n",
       " '0446601640',\n",
       " '0451155750',\n",
       " '1931561648',\n",
       " '0805036504',\n",
       " '0515132136',\n",
       " '0375400117',\n",
       " '0099245027',\n",
       " '0425146413',\n",
       " '0671002481',\n",
       " '0553583980',\n",
       " ...]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 防止某些地区没有用户，取评分最高的商品进行推荐\n",
    "top2000_item_id_s = df_data_training['item_id'].value_counts()[:2000].index.tolist()\n",
    "top2000_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0440234743</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0452264464</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>14</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0971880107</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345402871</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345417623</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id location  age     item_id  rating\n",
       "20        9      usa    0  0440234743       0\n",
       "21        9      usa    0  0452264464       6\n",
       "29       14      usa    0  0971880107       0\n",
       "30       16      usa    0  0345402871       9\n",
       "31       16      usa    0  0345417623       0"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#\n",
    "df_data_training_top2000 = df_data_training[\n",
    "    df_data_training['item_id'].isin(top2000_item_id_s)\n",
    "]\n",
    "df_data_training_top2000.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1844262553',\n",
       " '0439139597',\n",
       " '0439136350',\n",
       " '0439064864',\n",
       " '0877017883',\n",
       " '0618002227',\n",
       " '0590353403',\n",
       " '0671027344',\n",
       " '0385199570',\n",
       " '0771060548',\n",
       " '0156528207',\n",
       " '0618129022',\n",
       " '0552128481',\n",
       " '0552131059',\n",
       " '0811801802',\n",
       " '0670032379',\n",
       " '0812550706',\n",
       " '0679785892',\n",
       " '0670894605',\n",
       " '0811825558']"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 取前20最受欢迎商品\n",
    "top20_item_id_s = df_data_training_top2000.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20].index.tolist()\n",
    "top20_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每一个特征对应的推荐列表\n",
    "for location in feature_recommand.keys():\n",
    "    for age in feature_recommand[location].keys():\n",
    "#         print(location,age)\n",
    "        feature_recommand_len = len(feature_recommand[location][age])\n",
    "        feature_recommand[location][age] += top20_item_id_s[:20-feature_recommand_len]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(feature_recommand,open('./data/feature_recommand.pkl','wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519',\n",
       "               '1857022424',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883'],\n",
       "              4: ['0091867770',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'france': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900',\n",
       "               '1844262553',\n",
       "               '0439139597'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'n/a': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'portugal': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385',\n",
       "               '1844262553'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'spain': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553',\n",
       "               '0552147680',\n",
       "               '0552131067',\n",
       "               '0552996181',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667',\n",
       "               '0439064872',\n",
       "               '059035342X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743',\n",
       "               '044022165X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892']}})"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand = cPickle.load(open('./data/feature_recommand.pkl','rb'))\n",
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 导入测试集\n",
    "\n",
    "df_data_text = cPickle.load(open('./data/df_data_text.pkl','rb'))\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   344931 non-null  int64 \n",
      " 1   location  344931 non-null  object\n",
      " 2   age       344931 non-null  int64 \n",
      " 3   item_id   344931 non-null  object\n",
      " 4   rating    344931 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 11.8+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_text.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "top_location_s = list(feature_recommand.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# 对location进行处理\n",
    "df_data_text['location'] = df_data_text['location'].apply(lambda location : location if location in top_location_s else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "union_quantity = 0\n",
    "recommand_quantity = 0\n",
    "user_fav_quantity = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "执行到： australia 0\n",
      "执行到： australia 1\n",
      "执行到： australia 2\n",
      "执行到： australia 3\n",
      "执行到： australia 4\n",
      "执行到： australia 5\n",
      "执行到： canada 0\n",
      "执行到： canada 1\n",
      "执行到： canada 2\n",
      "执行到： canada 3\n",
      "执行到： canada 4\n",
      "执行到： canada 5\n",
      "执行到： france 0\n",
      "执行到： france 2\n",
      "执行到： france 3\n",
      "执行到： france 4\n",
      "执行到： france 5\n",
      "执行到： germany 0\n",
      "执行到： germany 1\n",
      "执行到： germany 2\n",
      "执行到： germany 3\n",
      "执行到： germany 4\n",
      "执行到： germany 5\n",
      "执行到： italy 0\n",
      "执行到： italy 2\n",
      "执行到： italy 3\n",
      "执行到： italy 4\n",
      "执行到： n/a 0\n",
      "执行到： other 0\n",
      "执行到： other 1\n",
      "执行到： other 2\n",
      "执行到： other 3\n",
      "执行到： other 4\n",
      "执行到： other 5\n",
      "执行到： portugal 0\n",
      "执行到： portugal 2\n",
      "执行到： portugal 3\n",
      "执行到： portugal 4\n",
      "执行到： portugal 5\n",
      "执行到： spain 0\n",
      "执行到： spain 2\n",
      "执行到： spain 3\n",
      "执行到： spain 4\n",
      "执行到： spain 5\n",
      "执行到： united kingdom 0\n",
      "执行到： united kingdom 1\n",
      "执行到： united kingdom 2\n",
      "执行到： united kingdom 3\n",
      "执行到： united kingdom 4\n",
      "执行到： united kingdom 5\n",
      "执行到： usa 0\n",
      "执行到： usa 1\n",
      "执行到： usa 2\n",
      "执行到： usa 3\n",
      "执行到： usa 4\n",
      "执行到： usa 5\n",
      "准确率: 0.0003806202422469719\n",
      "召回率: 0.0032610965638002216\n"
     ]
    }
   ],
   "source": [
    "for location,groupby_location in df_data_text.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        print('执行到：',location,age)\n",
    "        for user_id,groupby_location_age_userid in groupby_location_age.groupby('user_id'):\n",
    "            items_rating = groupby_location_age_userid.groupby('item_id')['rating'].mean().sort_values(ascending=False)\n",
    "            user_fav_items = [\n",
    "                item_id\n",
    "                for item_id in items_rating.index if items_rating[item_id] >= 5\n",
    "            ]\n",
    "            recommand_items = feature_recommand[location][age]\n",
    "            union_quantity += len(\n",
    "                set(user_fav_items) & set(recommand_items)\n",
    "            )\n",
    "            recommand_quantity += len(recommand_items)\n",
    "            user_fav_quantity += len(user_fav_items)\n",
    "print('准确率:',union_quantity / recommand_quantity)\n",
    "print('召回率:',union_quantity / user_fav_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "metadata": {
     "collapsed": false
    },
    "source": []
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
